import { ref, onUnmounted } from 'vue'

/**
 * 组件生命周期管理混入
 * 用于防止组件销毁后的异步操作访问DOM
 */
export function useLifecycle() {
  const isComponentMounted = ref(true)
  
  // 组件卸载时设置标志
  onUnmounted(() => {
    isComponentMounted.value = false
  })
  
  /**
   * 检查组件是否仍然挂载
   * @returns {boolean} 组件是否仍然挂载
   */
  const checkMounted = () => {
    return isComponentMounted.value
  }
  
  /**
   * 安全执行异步操作
   * @param {Function} asyncFn 异步函数
   * @param {Function} errorHandler 错误处理函数
   */
  const safeAsync = async (asyncFn, errorHandler = console.error) => {
    if (!checkMounted()) {
      return
    }
    
    try {
      const result = await asyncFn()
      // 异步操作完成后再次检查组件状态
      if (checkMounted()) {
        return result
      }
    } catch (error) {
      if (checkMounted()) {
        errorHandler(error)
      }
    }
  }
  
  /**
   * 安全访问ref
   * @param {Ref} refValue ref对象
   * @returns {*} ref的值，如果组件已销毁则返回null
   */
  const safeRef = (refValue) => {
    return checkMounted() ? refValue.value : null
  }
  
  return {
    isComponentMounted,
    checkMounted,
    safeAsync,
    safeRef
  }
}